package Homes;

import org.uqbar.commons.utils.Home;

import Aplicacion.Captura;
import Aplicacion.Vehiculo;
import Exceptions.PatenteNoDetectadaException;
import Externos.AnalizadorImagen;

public class CapturasHome extends Home<Captura> {

	private AnalizadorImagen analizadorImagenes;	

	private static CapturasHome instance = null;	
		
	public CapturasHome(Class<Captura> type) {		
		super(type);	
	}
	
	public static void reset(){
		instance = null;
	}
	
	public static synchronized CapturasHome getInstance(){
		if (instance == null)
			instance = new CapturasHome(Captura.class);
		return instance;	
	}

	/**
	 * Obtiene una captura del analizador de imagenes y la procesa.
	 * En caso de fallo la agrega a la cola de capturas
	 * @param captura
	 */
	public void ingresarCaptura(Captura captura){
	 
    /* El sistema externo intenta detectar la patente, sino puede arroja excepcion*/
		try {
			String patente = this.analizadorImagenes.getPatente(captura.getFoto());											
			this.procesarCaptura(captura, patente);
		}
		/* Sino agrego la captura a la cola de pendientes */
		catch (PatenteNoDetectadaException ex) {
			this.add(captura);
		}
	}

	/**
	 * Permite el ingreso manual de patentes
	 * @param patente
	 */
	public void ingresarPatenteManual(Captura captura, String patente){
		this.procesarCaptura(captura, patente);
		super.remove(captura);
	}
	
	/**
	 * Obtiene el vehiculo correspondiente a la captura,
	 * le agrega la infracción, evalua si es necesario agregarlo 
	 * a una nueva categoria y/o enviar notificaciones.  
	 * @param captura
	 * @param patente
	 */
	private void procesarCaptura(Captura captura, String patente){
		
		Vehiculo vehiculo = VehiculosHome.getInstance().getVehiculoByPatente(patente);
		captura.setVehiculo(vehiculo);			
		
		vehiculo.addInfraccion(captura.getInfraccion());				
		vehiculo.procesarAsignacion();		
		vehiculo.notificar(captura);
	}
	
	public void addPendiente(Captura captura){
		super.add(captura);
	}
	
	public Captura getFirst(){
		return super.getObjects().get(1);
	}

	public void remove(Captura captura) {
		super.remove(captura);
	}
	
	public AnalizadorImagen getAnalizadorImagenes() {
		return analizadorImagenes;
	}

	public void setAnalizadorImagenes(AnalizadorImagen analizadorImagenes) {
		this.analizadorImagenes = analizadorImagenes;
	}
	
}
